package com.ipartek.formacion.ficheros;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class CodificarFichero {

	static final String PATH_DATA1 = "data/Entrada.txt";
	static final String PATH_DATA2 = "data/Codificados.txt";
	static final String PATH_DATA3 = "data/Salida.txt";

	public static void main(String[] args) {

		FileReader ficheroEntrada = null;
		FileOutputStream ficheroCodificado = null;
		FileInputStream ficheroCodificadoE = null;
		BufferedInputStream bufferficheroCodificadoE = null;
		FileWriter ficheroSalida = null;

		try {

			ficheroEntrada = new FileReader(PATH_DATA1);
			ficheroCodificado = new FileOutputStream(PATH_DATA2);
			BufferedOutputStream bufferficheroCodificado = new BufferedOutputStream(
					ficheroCodificado);

			int caracter;

			// Genero el fichero codificado

			while ((caracter = ficheroEntrada.read()) != -1) {

				String valor = Integer.toString(caracter);
				char[] cadena = new char[valor.length()];
				valor.getChars(0, valor.length(), cadena, 0);

				for (int i = 0; i < cadena.length; i++) {
					bufferficheroCodificado.write(cadena[i]);
				}
				bufferficheroCodificado.write('.');
				bufferficheroCodificado.flush();
			}

			// Genero el fichero descodificado

			ficheroCodificadoE = new FileInputStream(PATH_DATA2);
			bufferficheroCodificadoE = new BufferedInputStream(
					ficheroCodificadoE);
			ficheroSalida = new FileWriter(PATH_DATA3);

			byte[] buffer = new byte[1024];

			int leidos = 0;

			while ((leidos = bufferficheroCodificadoE.read(buffer)) != -1) {
				String parte = new String(buffer, 0, leidos);
				StringTokenizer token = new StringTokenizer(parte, ".");
				while (token.hasMoreElements()) {
					ficheroSalida.write(Integer.parseInt((String) token
							.nextElement()));
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {

			if (ficheroEntrada != null) {
				try {
					ficheroEntrada.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (ficheroSalida != null) {
				try {
					ficheroSalida.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (ficheroCodificado != null) {
				try {
					ficheroCodificado.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bufferficheroCodificadoE != null) {
				try {
					bufferficheroCodificadoE.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}

	}
}